{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "0faab4e5",
   "metadata": {},
   "source": [
    "# Step 0: Load Packages and Libraries"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "ec40a842",
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "\n",
    "from sklearn.metrics.pairwise import cosine_similarity\n",
    "from sklearn.feature_extraction.text import TfidfVectorizer\n",
    "\n",
    "import os\n",
    "from scipy.sparse import coo_matrix"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b971bf5d",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "2a6b3b0f",
   "metadata": {},
   "source": [
    "# Step 1: Data Loading and Preprocessing"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "ab91064a",
   "metadata": {},
   "outputs": [
    {
     "ename": "FileNotFoundError",
     "evalue": "[Errno 2] No such file or directory: 'marketing_sample_for_walmart_com-walmart_com_product_review__20200701_20201231__5k_data.tsv'",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mFileNotFoundError\u001b[0m                         Traceback (most recent call last)",
      "Cell \u001b[1;32mIn[2], line 2\u001b[0m\n\u001b[0;32m      1\u001b[0m \u001b[38;5;66;03m# Read your dataset (replace 'marketing_sample_for_walmart_com-walmart_com_product_review__20200701_20201231__5k_data.tsv' with your dataset path)\u001b[39;00m\n\u001b[1;32m----> 2\u001b[0m train_data \u001b[38;5;241m=\u001b[39m pd\u001b[38;5;241m.\u001b[39mread_csv(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mmarketing_sample_for_walmart_com-walmart_com_product_review__20200701_20201231__5k_data.tsv\u001b[39m\u001b[38;5;124m'\u001b[39m, sep\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;130;01m\\t\u001b[39;00m\u001b[38;5;124m'\u001b[39m)\n\u001b[0;32m      3\u001b[0m train_data\u001b[38;5;241m.\u001b[39mcolumns\n",
      "File \u001b[1;32m~\\anaconda3\\Lib\\site-packages\\pandas\\io\\parsers\\readers.py:912\u001b[0m, in \u001b[0;36mread_csv\u001b[1;34m(filepath_or_buffer, sep, delimiter, header, names, index_col, usecols, dtype, engine, converters, true_values, false_values, skipinitialspace, skiprows, skipfooter, nrows, na_values, keep_default_na, na_filter, verbose, skip_blank_lines, parse_dates, infer_datetime_format, keep_date_col, date_parser, date_format, dayfirst, cache_dates, iterator, chunksize, compression, thousands, decimal, lineterminator, quotechar, quoting, doublequote, escapechar, comment, encoding, encoding_errors, dialect, on_bad_lines, delim_whitespace, low_memory, memory_map, float_precision, storage_options, dtype_backend)\u001b[0m\n\u001b[0;32m    899\u001b[0m kwds_defaults \u001b[38;5;241m=\u001b[39m _refine_defaults_read(\n\u001b[0;32m    900\u001b[0m     dialect,\n\u001b[0;32m    901\u001b[0m     delimiter,\n\u001b[1;32m   (...)\u001b[0m\n\u001b[0;32m    908\u001b[0m     dtype_backend\u001b[38;5;241m=\u001b[39mdtype_backend,\n\u001b[0;32m    909\u001b[0m )\n\u001b[0;32m    910\u001b[0m kwds\u001b[38;5;241m.\u001b[39mupdate(kwds_defaults)\n\u001b[1;32m--> 912\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m _read(filepath_or_buffer, kwds)\n",
      "File \u001b[1;32m~\\anaconda3\\Lib\\site-packages\\pandas\\io\\parsers\\readers.py:577\u001b[0m, in \u001b[0;36m_read\u001b[1;34m(filepath_or_buffer, kwds)\u001b[0m\n\u001b[0;32m    574\u001b[0m _validate_names(kwds\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mnames\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m))\n\u001b[0;32m    576\u001b[0m \u001b[38;5;66;03m# Create the parser.\u001b[39;00m\n\u001b[1;32m--> 577\u001b[0m parser \u001b[38;5;241m=\u001b[39m TextFileReader(filepath_or_buffer, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwds)\n\u001b[0;32m    579\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m chunksize \u001b[38;5;129;01mor\u001b[39;00m iterator:\n\u001b[0;32m    580\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m parser\n",
      "File \u001b[1;32m~\\anaconda3\\Lib\\site-packages\\pandas\\io\\parsers\\readers.py:1407\u001b[0m, in \u001b[0;36mTextFileReader.__init__\u001b[1;34m(self, f, engine, **kwds)\u001b[0m\n\u001b[0;32m   1404\u001b[0m     \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39moptions[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mhas_index_names\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m=\u001b[39m kwds[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mhas_index_names\u001b[39m\u001b[38;5;124m\"\u001b[39m]\n\u001b[0;32m   1406\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mhandles: IOHandles \u001b[38;5;241m|\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m-> 1407\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_engine \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_make_engine(f, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mengine)\n",
      "File \u001b[1;32m~\\anaconda3\\Lib\\site-packages\\pandas\\io\\parsers\\readers.py:1661\u001b[0m, in \u001b[0;36mTextFileReader._make_engine\u001b[1;34m(self, f, engine)\u001b[0m\n\u001b[0;32m   1659\u001b[0m     \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mb\u001b[39m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;129;01min\u001b[39;00m mode:\n\u001b[0;32m   1660\u001b[0m         mode \u001b[38;5;241m+\u001b[39m\u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mb\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m-> 1661\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mhandles \u001b[38;5;241m=\u001b[39m get_handle(\n\u001b[0;32m   1662\u001b[0m     f,\n\u001b[0;32m   1663\u001b[0m     mode,\n\u001b[0;32m   1664\u001b[0m     encoding\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39moptions\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mencoding\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m),\n\u001b[0;32m   1665\u001b[0m     compression\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39moptions\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcompression\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m),\n\u001b[0;32m   1666\u001b[0m     memory_map\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39moptions\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmemory_map\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;28;01mFalse\u001b[39;00m),\n\u001b[0;32m   1667\u001b[0m     is_text\u001b[38;5;241m=\u001b[39mis_text,\n\u001b[0;32m   1668\u001b[0m     errors\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39moptions\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mencoding_errors\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mstrict\u001b[39m\u001b[38;5;124m\"\u001b[39m),\n\u001b[0;32m   1669\u001b[0m     storage_options\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39moptions\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mstorage_options\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m),\n\u001b[0;32m   1670\u001b[0m )\n\u001b[0;32m   1671\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mhandles \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[0;32m   1672\u001b[0m f \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mhandles\u001b[38;5;241m.\u001b[39mhandle\n",
      "File \u001b[1;32m~\\anaconda3\\Lib\\site-packages\\pandas\\io\\common.py:859\u001b[0m, in \u001b[0;36mget_handle\u001b[1;34m(path_or_buf, mode, encoding, compression, memory_map, is_text, errors, storage_options)\u001b[0m\n\u001b[0;32m    854\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(handle, \u001b[38;5;28mstr\u001b[39m):\n\u001b[0;32m    855\u001b[0m     \u001b[38;5;66;03m# Check whether the filename is to be opened in binary mode.\u001b[39;00m\n\u001b[0;32m    856\u001b[0m     \u001b[38;5;66;03m# Binary mode does not support 'encoding' and 'newline'.\u001b[39;00m\n\u001b[0;32m    857\u001b[0m     \u001b[38;5;28;01mif\u001b[39;00m ioargs\u001b[38;5;241m.\u001b[39mencoding \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mb\u001b[39m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;129;01min\u001b[39;00m ioargs\u001b[38;5;241m.\u001b[39mmode:\n\u001b[0;32m    858\u001b[0m         \u001b[38;5;66;03m# Encoding\u001b[39;00m\n\u001b[1;32m--> 859\u001b[0m         handle \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mopen\u001b[39m(\n\u001b[0;32m    860\u001b[0m             handle,\n\u001b[0;32m    861\u001b[0m             ioargs\u001b[38;5;241m.\u001b[39mmode,\n\u001b[0;32m    862\u001b[0m             encoding\u001b[38;5;241m=\u001b[39mioargs\u001b[38;5;241m.\u001b[39mencoding,\n\u001b[0;32m    863\u001b[0m             errors\u001b[38;5;241m=\u001b[39merrors,\n\u001b[0;32m    864\u001b[0m             newline\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m\"\u001b[39m,\n\u001b[0;32m    865\u001b[0m         )\n\u001b[0;32m    866\u001b[0m     \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m    867\u001b[0m         \u001b[38;5;66;03m# Binary mode\u001b[39;00m\n\u001b[0;32m    868\u001b[0m         handle \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mopen\u001b[39m(handle, ioargs\u001b[38;5;241m.\u001b[39mmode)\n",
      "\u001b[1;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: 'marketing_sample_for_walmart_com-walmart_com_product_review__20200701_20201231__5k_data.tsv'"
     ]
    }
   ],
   "source": [
    "# Read your dataset (replace 'marketing_sample_for_walmart_com-walmart_com_product_review__20200701_20201231__5k_data.tsv' with your dataset path)\n",
    "train_data = pd.read_csv('C:\\Users\\govin\\Downloads\\E-Commerece-Recommendation-System-Machine-Learning-Product-Recommendation-system--main\\marketing_sample_for_walmart_com-walmart_com_product_review__20200701_20201231__5k_data.tsv', sep='\\t')\n",
    "train_data.columns"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "42b87218",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Uniq Id</th>\n",
       "      <th>Product Id</th>\n",
       "      <th>Product Rating</th>\n",
       "      <th>Product Reviews Count</th>\n",
       "      <th>Product Category</th>\n",
       "      <th>Product Brand</th>\n",
       "      <th>Product Name</th>\n",
       "      <th>Product Image Url</th>\n",
       "      <th>Product Description</th>\n",
       "      <th>Product Tags</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1705736792d82aa2f2d3caf1c07c53f4</td>\n",
       "      <td>2e17bf4acecdece67fc00f07ad62c910</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>Premium Beauty &gt; Premium Makeup &gt; Premium Nail...</td>\n",
       "      <td>OPI</td>\n",
       "      <td>OPI Infinite Shine, Nail Lacquer Nail Polish, ...</td>\n",
       "      <td>https://i5.walmartimages.com/asr/0e1f4c51-c1a4...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>OPI Infinite Shine, Nail Lacquer Nail Polish, ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>95a9fe6f4810fcfc7ff244fd06784f11</td>\n",
       "      <td>076e5854a62dd283c253d6bae415af1f</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>Beauty &gt; Hair Care &gt; Hair Color &gt; Auburn Hair ...</td>\n",
       "      <td>Nice'n Easy</td>\n",
       "      <td>Nice n Easy Permanent Color, 111 Natural Mediu...</td>\n",
       "      <td>https://i5.walmartimages.com/asr/9c8e42e4-13a5...</td>\n",
       "      <td>Pack of 3 Pack of 3 for the UPC: 381519000201 ...</td>\n",
       "      <td>Nice 'n Easy Permanent Color, 111 Natural Medi...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>8d4d0330178d3ed181b15a4102b287f2</td>\n",
       "      <td>8a4fe5d9c7a6ed26cc44d785a454b124</td>\n",
       "      <td>4.5</td>\n",
       "      <td>29221.0</td>\n",
       "      <td>Beauty &gt; Hair Care &gt; Hair Color &gt; Permanent Ha...</td>\n",
       "      <td>Clairol</td>\n",
       "      <td>Clairol Nice N Easy Permanent Color 7/106A Nat...</td>\n",
       "      <td>https://i5.walmartimages.com/asr/e3a601c2-6a2b...</td>\n",
       "      <td>This Clairol Nice N Easy Permanent Color gives...</td>\n",
       "      <td>Clairol Nice 'N Easy Permanent Color 7/106A Na...</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                            Uniq Id                        Product Id  \\\n",
       "0  1705736792d82aa2f2d3caf1c07c53f4  2e17bf4acecdece67fc00f07ad62c910   \n",
       "1  95a9fe6f4810fcfc7ff244fd06784f11  076e5854a62dd283c253d6bae415af1f   \n",
       "2  8d4d0330178d3ed181b15a4102b287f2  8a4fe5d9c7a6ed26cc44d785a454b124   \n",
       "\n",
       "   Product Rating  Product Reviews Count  \\\n",
       "0             NaN                    NaN   \n",
       "1             NaN                    NaN   \n",
       "2             4.5                29221.0   \n",
       "\n",
       "                                    Product Category Product Brand  \\\n",
       "0  Premium Beauty > Premium Makeup > Premium Nail...           OPI   \n",
       "1  Beauty > Hair Care > Hair Color > Auburn Hair ...   Nice'n Easy   \n",
       "2  Beauty > Hair Care > Hair Color > Permanent Ha...       Clairol   \n",
       "\n",
       "                                        Product Name  \\\n",
       "0  OPI Infinite Shine, Nail Lacquer Nail Polish, ...   \n",
       "1  Nice n Easy Permanent Color, 111 Natural Mediu...   \n",
       "2  Clairol Nice N Easy Permanent Color 7/106A Nat...   \n",
       "\n",
       "                                   Product Image Url  \\\n",
       "0  https://i5.walmartimages.com/asr/0e1f4c51-c1a4...   \n",
       "1  https://i5.walmartimages.com/asr/9c8e42e4-13a5...   \n",
       "2  https://i5.walmartimages.com/asr/e3a601c2-6a2b...   \n",
       "\n",
       "                                 Product Description  \\\n",
       "0                                                NaN   \n",
       "1  Pack of 3 Pack of 3 for the UPC: 381519000201 ...   \n",
       "2  This Clairol Nice N Easy Permanent Color gives...   \n",
       "\n",
       "                                        Product Tags  \n",
       "0  OPI Infinite Shine, Nail Lacquer Nail Polish, ...  \n",
       "1  Nice 'n Easy Permanent Color, 111 Natural Medi...  \n",
       "2  Clairol Nice 'N Easy Permanent Color 7/106A Na...  "
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_data = train_data[['Uniq Id','Product Id', 'Product Rating', 'Product Reviews Count', 'Product Category', 'Product Brand', 'Product Name', 'Product Image Url', 'Product Description', 'Product Tags']]\n",
    "train_data.head(3)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f75a34bb",
   "metadata": {},
   "source": [
    "# Basic Operations"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "88d91adf",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0       OPI Infinite Shine, Nail Lacquer Nail Polish, ...\n",
       "1       Nice 'n Easy Permanent Color, 111 Natural Medi...\n",
       "2       Clairol Nice 'N Easy Permanent Color 7/106A Na...\n",
       "3       Kokie Professional Matte Lipstick, Hot Berry, ...\n",
       "4       Gillette TRAC II Plus Razor Blade Refills, Fit...\n",
       "                              ...                        \n",
       "4995    Garden Mint Room Spray (Double Strength), 4 ou...\n",
       "4996    Garnier Nutrisse Nourishing Hair Color Creme (...\n",
       "4997    Nail File Electric Drill, 6 in 1 Professional ...\n",
       "4998    Creed Love In Black Hair And Body Wash 6.8oz/2...\n",
       "4999                    Foundation, Wal-mart, Walmart.com\n",
       "Name: Product Tags, Length: 5000, dtype: object"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_data['Product Tags']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "e377ddbb",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(5000, 10)"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_data.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "9abc0a9c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Uniq Id                     0\n",
       "Product Id                  0\n",
       "Product Rating           2806\n",
       "Product Reviews Count    1654\n",
       "Product Category           10\n",
       "Product Brand              13\n",
       "Product Name                0\n",
       "Product Image Url           0\n",
       "Product Description      1127\n",
       "Product Tags                0\n",
       "dtype: int64"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_data.isnull().sum()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "40da2a64",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Fill missing values in 'Product Rating' with a default value (e.g., 0)\n",
    "train_data['Product Rating'].fillna(0, inplace=True)\n",
    "# Fill missing values in 'Product Reviews Count' with a default value (e.g., 0)\n",
    "train_data['Product Reviews Count'].fillna(0, inplace=True)\n",
    "# Fill missing values in 'Product Category' with a default value (e.g., 'Unknown')\n",
    "train_data['Product Category'].fillna('', inplace=True)\n",
    "# Fill missing values in 'Product Brand' with a default value (e.g., 'Unknown')\n",
    "train_data['Product Brand'].fillna('', inplace=True)\n",
    "# Fill missing values in 'Product Description' with an empty string\n",
    "train_data['Product Description'].fillna('', inplace=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "c6ae1d91",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Uniq Id                  0\n",
       "Product Id               0\n",
       "Product Rating           0\n",
       "Product Reviews Count    0\n",
       "Product Category         0\n",
       "Product Brand            0\n",
       "Product Name             0\n",
       "Product Image Url        0\n",
       "Product Description      0\n",
       "Product Tags             0\n",
       "dtype: int64"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_data.isnull().sum()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "fa4021f6",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_data.duplicated().sum()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "3028bdfc",
   "metadata": {},
   "outputs": [],
   "source": [
    "# make columns shorter\n",
    "# Define the mapping of current column names to shorter names\n",
    "column_name_mapping = {\n",
    "    'Uniq Id': 'ID',\n",
    "    'Product Id': 'ProdID',\n",
    "    'Product Rating': 'Rating',\n",
    "    'Product Reviews Count': 'ReviewCount',\n",
    "    'Product Category': 'Category',\n",
    "    'Product Brand': 'Brand',\n",
    "    'Product Name': 'Name',\n",
    "    'Product Image Url': 'ImageURL',\n",
    "    'Product Description': 'Description',\n",
    "    'Product Tags': 'Tags',\n",
    "    'Product Contents': 'Contents'\n",
    "}\n",
    "# Rename the columns using the mapping\n",
    "train_data.rename(columns=column_name_mapping, inplace=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "7b988d09",
   "metadata": {},
   "outputs": [],
   "source": [
    "train_data['ID'] = train_data['ID'].str.extract(r'(\\d+)').astype(float)\n",
    "train_data['ProdID'] = train_data['ProdID'].str.extract(r'(\\d+)').astype(float)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "57762064",
   "metadata": {},
   "source": [
    "# Step 2: EDA (Exploratory Data Analysis)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "id": "77d39f33",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Number of unique users: 1721\n",
      "Number of unique items: 1697\n",
      "Number of unique ratings: 36\n"
     ]
    }
   ],
   "source": [
    "# Basic statistics\n",
    "num_users = train_data['ID'].nunique()\n",
    "num_items = train_data['ProdID'].nunique()\n",
    "num_ratings = train_data['Rating'].nunique()\n",
    "print(f\"Number of unique users: {num_users}\")\n",
    "print(f\"Number of unique items: {num_items}\")\n",
    "print(f\"Number of unique ratings: {num_ratings}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "id": "5d91b1a1",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 576x432 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Pivot the DataFrame to create a heatmap\n",
    "heatmap_data = train_data.pivot_table('ID', 'Rating')\n",
    "\n",
    "# Create the heatmap\n",
    "plt.figure(figsize=(8, 6))\n",
    "sns.heatmap(heatmap_data, annot=True, fmt='g', cmap='coolwarm', cbar=True)\n",
    "plt.title('Heatmap of User Ratings')\n",
    "plt.xlabel('Ratings')\n",
    "plt.ylabel('User ID')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "id": "ab7bc904",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 864x360 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Distribution of interactions\n",
    "plt.figure(figsize=(12, 5))\n",
    "plt.subplot(1, 2, 1)\n",
    "train_data['ID'].value_counts().hist(bins=10, edgecolor='k')\n",
    "plt.xlabel('Interactions per User')\n",
    "plt.ylabel('Number of Users')\n",
    "plt.title('Distribution of Interactions per User')\n",
    "\n",
    "plt.subplot(1, 2, 2)\n",
    "train_data['ProdID'].value_counts().hist(bins=10, edgecolor='k',color='green')\n",
    "plt.xlabel('Interactions per Item')\n",
    "plt.ylabel('Number of Items')\n",
    "plt.title('Distribution of Interactions per Item')\n",
    "\n",
    "plt.tight_layout()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "id": "6d330260",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0.5, 1.0, 'Most Popular items')"
      ]
     },
     "execution_count": 55,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Most popular items\n",
    "popular_items = train_data['ProdID'].value_counts().head(5)\n",
    "popular_items.plot(kind='bar',color='red')\n",
    "plt.title(\"Most Popular items\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "id": "b9b8df99",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<AxesSubplot:xlabel='Rating'>"
      ]
     },
     "execution_count": 56,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# most rated counts\n",
    "train_data['Rating'].value_counts().plot(kind='bar',color='red')"
   ]
  },
  {
   "cell_type": "raw",
   "id": "c7b2cf34",
   "metadata": {},
   "source": [
    "# Step 2: EDA (Exploratory Data Analysis)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "dfec3404",
   "metadata": {},
   "source": [
    "# Step 3: Data Cleaning and Tags Creations"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "c16cf5b9",
   "metadata": {},
   "outputs": [],
   "source": [
    "import spacy\n",
    "from spacy.lang.en.stop_words import STOP_WORDS\n",
    "\n",
    "nlp = spacy.load(\"en_core_web_sm\")\n",
    "\n",
    "def clean_and_extract_tags(text):\n",
    "    doc = nlp(text.lower())\n",
    "    tags = [token.text for token in doc if token.text.isalnum() and token.text not in STOP_WORDS]\n",
    "    return ', '.join(tags)\n",
    "\n",
    "columns_to_extract_tags_from = ['Category', 'Brand', 'Description']\n",
    "\n",
    "for column in columns_to_extract_tags_from:\n",
    "    train_data[column] = train_data[column].apply(clean_and_extract_tags)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "c8ae69c5",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Concatenate the cleaned tags from all relevant columns\n",
    "train_data['Tags'] = train_data[columns_to_extract_tags_from].apply(lambda row: ', '.join(row), axis=1)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "844cf03c",
   "metadata": {},
   "source": [
    "# Rating Base Recommendations System"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "0e17cab4",
   "metadata": {},
   "outputs": [],
   "source": [
    "average_ratings = train_data.groupby(['Name','ReviewCount','Brand','ImageURL'])['Rating'].mean().reset_index()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "9bdb9c42",
   "metadata": {},
   "outputs": [],
   "source": [
    "top_rated_items = average_ratings.sort_values(by='Rating', ascending=False)\n",
    "\n",
    "rating_base_recommendation = top_rated_items.head(10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "dbd775cb",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\naimat\\AppData\\Local\\Temp\\ipykernel_4284\\565725879.py:1: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame.\n",
      "Try using .loc[row_indexer,col_indexer] = value instead\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  rating_base_recommendation['Rating'] = rating_base_recommendation['Rating'].astype(int)\n",
      "C:\\Users\\naimat\\AppData\\Local\\Temp\\ipykernel_4284\\565725879.py:2: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame.\n",
      "Try using .loc[row_indexer,col_indexer] = value instead\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  rating_base_recommendation['ReviewCount'] = rating_base_recommendation['ReviewCount'].astype(int)\n"
     ]
    }
   ],
   "source": [
    "rating_base_recommendation['Rating'] = rating_base_recommendation['Rating'].astype(int)\n",
    "rating_base_recommendation['ReviewCount'] = rating_base_recommendation['ReviewCount'].astype(int)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "eeefbc7b",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Rating Base Recommendation System: (Trending Products)\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\naimat\\AppData\\Local\\Temp\\ipykernel_4284\\393183274.py:2: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame.\n",
      "Try using .loc[row_indexer,col_indexer] = value instead\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  rating_base_recommendation[['Name','Rating','ReviewCount','Brand','ImageURL']] = rating_base_recommendation[['Name','Rating','ReviewCount','Brand','ImageURL']]\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Name</th>\n",
       "      <th>ReviewCount</th>\n",
       "      <th>Brand</th>\n",
       "      <th>ImageURL</th>\n",
       "      <th>Rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1686</th>\n",
       "      <td>Electric Shaver, Triple Shaving Time Electric ...</td>\n",
       "      <td>4</td>\n",
       "      <td>Moosoo</td>\n",
       "      <td>https://i5.walmartimages.com/asr/e7dcd553-90df...</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>526</th>\n",
       "      <td>Alaffia Body Lotion, Vanilla, 32 Oz</td>\n",
       "      <td>2</td>\n",
       "      <td>Alaffia</td>\n",
       "      <td>https://i5.walmartimages.com/asr/2988c323-cb6f...</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2053</th>\n",
       "      <td>Gold Bond Ultimate Ultimate Healing Lotion, Al...</td>\n",
       "      <td>2</td>\n",
       "      <td>Gold Bond</td>\n",
       "      <td>https://i5.walmartimages.com/asr/34b610e7-05db...</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4716</th>\n",
       "      <td>Versace Man Eau Fraiche Eau De Toilette Spray,...</td>\n",
       "      <td>24</td>\n",
       "      <td>Versace</td>\n",
       "      <td>https://i5.walmartimages.com/asr/edaaeed5-9da0...</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2058</th>\n",
       "      <td>Goldwell StyleSign 1 Flat Marvel Straightening...</td>\n",
       "      <td>2</td>\n",
       "      <td>Goldwell</td>\n",
       "      <td>https://i5.walmartimages.com/asr/3bf90289-6980...</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3842</th>\n",
       "      <td>Red Devil 0322 Steel Wool # 00 Very Fine, 8 Pa...</td>\n",
       "      <td>1</td>\n",
       "      <td>Red Devil</td>\n",
       "      <td>https://i5.walmartimages.com/asr/60bfe5ba-774c...</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>510</th>\n",
       "      <td>Air Wick Plug in Starter Kit, Warmer + 1 Refil...</td>\n",
       "      <td>1</td>\n",
       "      <td>Air Wick</td>\n",
       "      <td>https://i5.walmartimages.com/asr/0fac65b2-c6aa...</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3841</th>\n",
       "      <td>Recovery Complex Anti-Frizz Shine Serum by Bai...</td>\n",
       "      <td>4</td>\n",
       "      <td>Bain de Terre</td>\n",
       "      <td>https://i5.walmartimages.com/asr/fcdb4d2e-3727...</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2687</th>\n",
       "      <td>Long Aid Extra Dry Formula Curl Activator Gel ...</td>\n",
       "      <td>12</td>\n",
       "      <td>Long Aid</td>\n",
       "      <td>https://i5.walmartimages.com/asr/f7f29199-bfa5...</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2062</th>\n",
       "      <td>Good Sense 60-Day Air Care System, Citrus, 2 o...</td>\n",
       "      <td>1</td>\n",
       "      <td>Diversey</td>\n",
       "      <td>https://i5.walmartimages.com/asr/025a7068-7bb1...</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                                   Name  ReviewCount  \\\n",
       "1686  Electric Shaver, Triple Shaving Time Electric ...            4   \n",
       "526                 Alaffia Body Lotion, Vanilla, 32 Oz            2   \n",
       "2053  Gold Bond Ultimate Ultimate Healing Lotion, Al...            2   \n",
       "4716  Versace Man Eau Fraiche Eau De Toilette Spray,...           24   \n",
       "2058  Goldwell StyleSign 1 Flat Marvel Straightening...            2   \n",
       "3842  Red Devil 0322 Steel Wool # 00 Very Fine, 8 Pa...            1   \n",
       "510   Air Wick Plug in Starter Kit, Warmer + 1 Refil...            1   \n",
       "3841  Recovery Complex Anti-Frizz Shine Serum by Bai...            4   \n",
       "2687  Long Aid Extra Dry Formula Curl Activator Gel ...           12   \n",
       "2062  Good Sense 60-Day Air Care System, Citrus, 2 o...            1   \n",
       "\n",
       "              Brand                                           ImageURL  Rating  \n",
       "1686         Moosoo  https://i5.walmartimages.com/asr/e7dcd553-90df...       5  \n",
       "526         Alaffia  https://i5.walmartimages.com/asr/2988c323-cb6f...       5  \n",
       "2053      Gold Bond  https://i5.walmartimages.com/asr/34b610e7-05db...       5  \n",
       "4716        Versace  https://i5.walmartimages.com/asr/edaaeed5-9da0...       5  \n",
       "2058       Goldwell  https://i5.walmartimages.com/asr/3bf90289-6980...       5  \n",
       "3842      Red Devil  https://i5.walmartimages.com/asr/60bfe5ba-774c...       5  \n",
       "510        Air Wick  https://i5.walmartimages.com/asr/0fac65b2-c6aa...       5  \n",
       "3841  Bain de Terre  https://i5.walmartimages.com/asr/fcdb4d2e-3727...       5  \n",
       "2687       Long Aid  https://i5.walmartimages.com/asr/f7f29199-bfa5...       5  \n",
       "2062       Diversey  https://i5.walmartimages.com/asr/025a7068-7bb1...       5  "
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "print(\"Rating Base Recommendation System: (Trending Products)\")\n",
    "rating_base_recommendation[['Name','Rating','ReviewCount','Brand','ImageURL']] = rating_base_recommendation[['Name','Rating','ReviewCount','Brand','ImageURL']]\n",
    "rating_base_recommendation"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d6c86fcf",
   "metadata": {},
   "source": [
    "# Content Base Recommendation system (User Preferences or Items similarities)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "79cc6f25",
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.feature_extraction.text import TfidfVectorizer\n",
    "from sklearn.metrics.pairwise import cosine_similarity\n",
    "\n",
    "tfidf_vectorizer = TfidfVectorizer(stop_words='english')\n",
    "tfidf_matrix_content = tfidf_vectorizer.fit_transform(train_data['Tags'])\n",
    "cosine_similarities_content = cosine_similarity(tfidf_matrix_content,tfidf_matrix_content)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "91457320",
   "metadata": {},
   "outputs": [],
   "source": [
    "item_name = 'OPI Infinite Shine, Nail Lacquer Nail Polish, Bubble Bath'\n",
    "item_index = train_data[train_data['Name']==item_name].index[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "e763a44d",
   "metadata": {},
   "outputs": [],
   "source": [
    "similar_items = list(enumerate(cosine_similarities_content[item_index]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "2066dd9c",
   "metadata": {},
   "outputs": [],
   "source": [
    "similar_items = sorted(similar_items, key=lambda x:x[1], reverse=True)\n",
    "top_similar_items = similar_items[1:10]\n",
    "\n",
    "recommended_items_indics = [x[0] for x in top_similar_items]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "721fa02b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Name</th>\n",
       "      <th>ReviewCount</th>\n",
       "      <th>Brand</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>4854</th>\n",
       "      <td>OPI Infinite Shine Nail Polish, Dulce De Leche...</td>\n",
       "      <td>1.0</td>\n",
       "      <td>OPI</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3052</th>\n",
       "      <td>OPI Nail Lacquer Nail Polish, Hawaiian Orchid</td>\n",
       "      <td>1.0</td>\n",
       "      <td>OPI</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4010</th>\n",
       "      <td>OPI Nail Polish, Are We There Yet?, 0.5 Fl Oz</td>\n",
       "      <td>2.0</td>\n",
       "      <td>OPI</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4752</th>\n",
       "      <td>OPI Infinite Shine Nail Polish, Let Love Spark...</td>\n",
       "      <td>3.0</td>\n",
       "      <td>OPI</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4356</th>\n",
       "      <td>OPI Nail Lacquer Nail Polish, Go with the Lava...</td>\n",
       "      <td>1.0</td>\n",
       "      <td>OPI</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3967</th>\n",
       "      <td>OPI Infinite Shine Nail Polish, Mini Scotland ...</td>\n",
       "      <td>1.0</td>\n",
       "      <td>OPI</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2952</th>\n",
       "      <td>OPI Nail Lacquer Nail Polish, Miami Beet</td>\n",
       "      <td>0.0</td>\n",
       "      <td>OPI</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4966</th>\n",
       "      <td>OPI Nail GelColor + Infinite Shine Polish -TAU...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>OPI</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3252</th>\n",
       "      <td>OPI Nail Lacquer Nail Polish, Shorts Story</td>\n",
       "      <td>1.0</td>\n",
       "      <td>OPI</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                                   Name  ReviewCount Brand\n",
       "4854  OPI Infinite Shine Nail Polish, Dulce De Leche...          1.0   OPI\n",
       "3052      OPI Nail Lacquer Nail Polish, Hawaiian Orchid          1.0   OPI\n",
       "4010      OPI Nail Polish, Are We There Yet?, 0.5 Fl Oz          2.0   OPI\n",
       "4752  OPI Infinite Shine Nail Polish, Let Love Spark...          3.0   OPI\n",
       "4356  OPI Nail Lacquer Nail Polish, Go with the Lava...          1.0   OPI\n",
       "3967  OPI Infinite Shine Nail Polish, Mini Scotland ...          1.0   OPI\n",
       "2952           OPI Nail Lacquer Nail Polish, Miami Beet          0.0   OPI\n",
       "4966  OPI Nail GelColor + Infinite Shine Polish -TAU...          0.0   OPI\n",
       "3252         OPI Nail Lacquer Nail Polish, Shorts Story          1.0   OPI"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_data.iloc[recommended_items_indics][['Name','ReviewCount','Brand']]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6d143b78",
   "metadata": {},
   "source": [
    "# Function To Recommend Products for Content Base"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "06226aae",
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.feature_extraction.text import TfidfVectorizer\n",
    "from sklearn.metrics.pairwise import cosine_similarity\n",
    "\n",
    "def content_based_recommendations(train_data, item_name, top_n=10):\n",
    "    # Check if the item name exists in the training data\n",
    "    if item_name not in train_data['Name'].values:\n",
    "        print(f\"Item '{item_name}' not found in the training data.\")\n",
    "        return pd.DataFrame()\n",
    "\n",
    "    # Create a TF-IDF vectorizer for item descriptions\n",
    "    tfidf_vectorizer = TfidfVectorizer(stop_words='english')\n",
    "\n",
    "    # Apply TF-IDF vectorization to item descriptions\n",
    "    tfidf_matrix_content = tfidf_vectorizer.fit_transform(train_data['Tags'])\n",
    "\n",
    "    # Calculate cosine similarity between items based on descriptions\n",
    "    cosine_similarities_content = cosine_similarity(tfidf_matrix_content, tfidf_matrix_content)\n",
    "\n",
    "    # Find the index of the item\n",
    "    item_index = train_data[train_data['Name'] == item_name].index[0]\n",
    "\n",
    "    # Get the cosine similarity scores for the item\n",
    "    similar_items = list(enumerate(cosine_similarities_content[item_index]))\n",
    "\n",
    "    # Sort similar items by similarity score in descending order\n",
    "    similar_items = sorted(similar_items, key=lambda x: x[1], reverse=True)\n",
    "\n",
    "    # Get the top N most similar items (excluding the item itself)\n",
    "    top_similar_items = similar_items[1:top_n+1]\n",
    "\n",
    "    # Get the indices of the top similar items\n",
    "    recommended_item_indices = [x[0] for x in top_similar_items]\n",
    "\n",
    "    # Get the details of the top similar items\n",
    "    recommended_items_details = train_data.iloc[recommended_item_indices][['Name', 'ReviewCount', 'Brand', 'ImageURL', 'Rating']]\n",
    "\n",
    "    return recommended_items_details"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "d9d95dce",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Name</th>\n",
       "      <th>ReviewCount</th>\n",
       "      <th>Brand</th>\n",
       "      <th>ImageURL</th>\n",
       "      <th>Rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>4854</th>\n",
       "      <td>OPI Infinite Shine Nail Polish, Dulce De Leche...</td>\n",
       "      <td>1.0</td>\n",
       "      <td>OPI</td>\n",
       "      <td>https://i5.walmartimages.com/asr/466527fe-9e5e...</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3052</th>\n",
       "      <td>OPI Nail Lacquer Nail Polish, Hawaiian Orchid</td>\n",
       "      <td>1.0</td>\n",
       "      <td>OPI</td>\n",
       "      <td>https://i5.walmartimages.com/asr/cef5a3ca-dfed...</td>\n",
       "      <td>4.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4010</th>\n",
       "      <td>OPI Nail Polish, Are We There Yet?, 0.5 Fl Oz</td>\n",
       "      <td>2.0</td>\n",
       "      <td>OPI</td>\n",
       "      <td>https://i5.walmartimages.com/asr/bb0c5e20-0ead...</td>\n",
       "      <td>3.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4752</th>\n",
       "      <td>OPI Infinite Shine Nail Polish, Let Love Spark...</td>\n",
       "      <td>3.0</td>\n",
       "      <td>OPI</td>\n",
       "      <td>https://i5.walmartimages.com/asr/7eef48ac-3a28...</td>\n",
       "      <td>4.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4356</th>\n",
       "      <td>OPI Nail Lacquer Nail Polish, Go with the Lava...</td>\n",
       "      <td>1.0</td>\n",
       "      <td>OPI</td>\n",
       "      <td>https://i5.walmartimages.com/asr/6cd23e3d-f3be...</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3967</th>\n",
       "      <td>OPI Infinite Shine Nail Polish, Mini Scotland ...</td>\n",
       "      <td>1.0</td>\n",
       "      <td>OPI</td>\n",
       "      <td>https://i5.walmartimages.com/asr/b673df9d-cc73...</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2952</th>\n",
       "      <td>OPI Nail Lacquer Nail Polish, Miami Beet</td>\n",
       "      <td>0.0</td>\n",
       "      <td>OPI</td>\n",
       "      <td>https://i5.walmartimages.com/asr/083f9170-da65...</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4966</th>\n",
       "      <td>OPI Nail GelColor + Infinite Shine Polish -TAU...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>OPI</td>\n",
       "      <td>https://i5.walmartimages.com/asr/a364a6d7-0cd1...</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                                   Name  ReviewCount Brand  \\\n",
       "4854  OPI Infinite Shine Nail Polish, Dulce De Leche...          1.0   OPI   \n",
       "3052      OPI Nail Lacquer Nail Polish, Hawaiian Orchid          1.0   OPI   \n",
       "4010      OPI Nail Polish, Are We There Yet?, 0.5 Fl Oz          2.0   OPI   \n",
       "4752  OPI Infinite Shine Nail Polish, Let Love Spark...          3.0   OPI   \n",
       "4356  OPI Nail Lacquer Nail Polish, Go with the Lava...          1.0   OPI   \n",
       "3967  OPI Infinite Shine Nail Polish, Mini Scotland ...          1.0   OPI   \n",
       "2952           OPI Nail Lacquer Nail Polish, Miami Beet          0.0   OPI   \n",
       "4966  OPI Nail GelColor + Infinite Shine Polish -TAU...          0.0   OPI   \n",
       "\n",
       "                                               ImageURL  Rating  \n",
       "4854  https://i5.walmartimages.com/asr/466527fe-9e5e...     5.0  \n",
       "3052  https://i5.walmartimages.com/asr/cef5a3ca-dfed...     4.0  \n",
       "4010  https://i5.walmartimages.com/asr/bb0c5e20-0ead...     3.0  \n",
       "4752  https://i5.walmartimages.com/asr/7eef48ac-3a28...     4.0  \n",
       "4356  https://i5.walmartimages.com/asr/6cd23e3d-f3be...     5.0  \n",
       "3967  https://i5.walmartimages.com/asr/b673df9d-cc73...     0.0  \n",
       "2952  https://i5.walmartimages.com/asr/083f9170-da65...     0.0  \n",
       "4966  https://i5.walmartimages.com/asr/a364a6d7-0cd1...     0.0  "
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Example: Get content-based recommendations for a specific item\n",
    "item_name = 'OPI Infinite Shine, Nail Lacquer Nail Polish, Bubble Bath'\n",
    "content_based_rec = content_based_recommendations(train_data, item_name, top_n=8)\n",
    "\n",
    "content_based_rec"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "04ebc5a6",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Name</th>\n",
       "      <th>ReviewCount</th>\n",
       "      <th>Brand</th>\n",
       "      <th>ImageURL</th>\n",
       "      <th>Rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>546</th>\n",
       "      <td>Kokie Professional Matte Lipstick, Kiss Me, 0....</td>\n",
       "      <td>0.0</td>\n",
       "      <td>Kokie Cosmetics</td>\n",
       "      <td>https://i5.walmartimages.com/asr/27dd82a2-2b9c...</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3406</th>\n",
       "      <td>Kokie Professional Matte Lipstick, Firecracker...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>Kokie Cosmetics</td>\n",
       "      <td>https://i5.walmartimages.com/asr/8312221b-ed22...</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2873</th>\n",
       "      <td>Kokie Professional Lip Poudre Liquid Matte Liq...</td>\n",
       "      <td>7.0</td>\n",
       "      <td>Kokie Cosmetics</td>\n",
       "      <td>https://i5.walmartimages.com/asr/31c99d9b-ea11...</td>\n",
       "      <td>3.4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4050</th>\n",
       "      <td>Kokie Professional Lip Poudre Liquid Matte Liq...</td>\n",
       "      <td>7.0</td>\n",
       "      <td>Kokie Cosmetics</td>\n",
       "      <td>https://i5.walmartimages.com/asr/fdd7498c-319f...</td>\n",
       "      <td>3.4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3023</th>\n",
       "      <td>Be Matte Lipstick - Pink</td>\n",
       "      <td>2.0</td>\n",
       "      <td>City Color</td>\n",
       "      <td>https://i5.walmartimages.com/asr/4425a13e-085f...</td>\n",
       "      <td>3.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>558</th>\n",
       "      <td>Kokie Professional Nail Polish, Girls Night , ...</td>\n",
       "      <td>6.0</td>\n",
       "      <td>Kokie Cosmetics</td>\n",
       "      <td>https://i5.walmartimages.com/asr/a6f6da7a-cb11...</td>\n",
       "      <td>4.2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4920</th>\n",
       "      <td>Kokie Professional Nail Polish, Jamacan Me Blu...</td>\n",
       "      <td>6.0</td>\n",
       "      <td>Kokie Cosmetics</td>\n",
       "      <td>https://i5.walmartimages.com/asr/16fc0e60-1c66...</td>\n",
       "      <td>4.2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3620</th>\n",
       "      <td>Kokie Professional Skin Perfect HD Foundation,...</td>\n",
       "      <td>9.0</td>\n",
       "      <td>Kokie Cosmetics</td>\n",
       "      <td>https://i5.walmartimages.com/asr/2f8fcaa9-7db7...</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                                   Name  ReviewCount  \\\n",
       "546   Kokie Professional Matte Lipstick, Kiss Me, 0....          0.0   \n",
       "3406  Kokie Professional Matte Lipstick, Firecracker...          0.0   \n",
       "2873  Kokie Professional Lip Poudre Liquid Matte Liq...          7.0   \n",
       "4050  Kokie Professional Lip Poudre Liquid Matte Liq...          7.0   \n",
       "3023                           Be Matte Lipstick - Pink          2.0   \n",
       "558   Kokie Professional Nail Polish, Girls Night , ...          6.0   \n",
       "4920  Kokie Professional Nail Polish, Jamacan Me Blu...          6.0   \n",
       "3620  Kokie Professional Skin Perfect HD Foundation,...          9.0   \n",
       "\n",
       "                Brand                                           ImageURL  \\\n",
       "546   Kokie Cosmetics  https://i5.walmartimages.com/asr/27dd82a2-2b9c...   \n",
       "3406  Kokie Cosmetics  https://i5.walmartimages.com/asr/8312221b-ed22...   \n",
       "2873  Kokie Cosmetics  https://i5.walmartimages.com/asr/31c99d9b-ea11...   \n",
       "4050  Kokie Cosmetics  https://i5.walmartimages.com/asr/fdd7498c-319f...   \n",
       "3023       City Color  https://i5.walmartimages.com/asr/4425a13e-085f...   \n",
       "558   Kokie Cosmetics  https://i5.walmartimages.com/asr/a6f6da7a-cb11...   \n",
       "4920  Kokie Cosmetics  https://i5.walmartimages.com/asr/16fc0e60-1c66...   \n",
       "3620  Kokie Cosmetics  https://i5.walmartimages.com/asr/2f8fcaa9-7db7...   \n",
       "\n",
       "      Rating  \n",
       "546      0.0  \n",
       "3406     0.0  \n",
       "2873     3.4  \n",
       "4050     3.4  \n",
       "3023     3.0  \n",
       "558      4.2  \n",
       "4920     4.2  \n",
       "3620     0.0  "
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Example: Get content-based recommendations for a specific item\n",
    "item_name = 'Kokie Professional Matte Lipstick, Hot Berry, 0.14 fl oz'\n",
    "content_based_rec = content_based_recommendations(train_data, item_name, top_n=8)\n",
    "\n",
    "content_based_rec"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2c4117a0",
   "metadata": {},
   "source": [
    "# Collaborative Filtering (User Item Similarity)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "561d1f39",
   "metadata": {},
   "outputs": [],
   "source": [
    "user_item_matrix = train_data.pivot_table(index='ID', columns='ProdID', values='Rating',aggfunc='mean').fillna(0).astype(int)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "da389a20",
   "metadata": {},
   "outputs": [],
   "source": [
    "user_similarity = cosine_similarity(user_item_matrix)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "ae4dcb37",
   "metadata": {},
   "outputs": [],
   "source": [
    "target_user_id = 4\n",
    "target_user_index = user_item_matrix.index.get_loc(target_user_id)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "a50c696d",
   "metadata": {},
   "outputs": [],
   "source": [
    "user_similarities = user_similarity[target_user_index]\n",
    "\n",
    "similar_user_indices = user_similarities.argsort()[::-1][1:]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "69deed31",
   "metadata": {},
   "outputs": [],
   "source": [
    "recommend_items = []\n",
    "\n",
    "for user_index in similar_user_indices:\n",
    "    rated_by_similar_user = user_item_matrix.iloc[user_index]\n",
    "    not_rated_by_target_user = (rated_by_similar_user==0) & (user_item_matrix.iloc[target_user_index]==0)\n",
    "    \n",
    "    recommend_items.extend(user_item_matrix.columns[not_rated_by_target_user][:10])\n",
    "\n",
    "recommended_items_details = train_data[train_data['ProdID'].isin(recommend_items)][['Name','ReviewCount','Brand','ImageURL','Rating']]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "id": "e3c54f65",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Name</th>\n",
       "      <th>ReviewCount</th>\n",
       "      <th>Brand</th>\n",
       "      <th>ImageURL</th>\n",
       "      <th>Rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>Clairol Natural Instincts Demi-Permanent Hair ...</td>\n",
       "      <td>2935.0</td>\n",
       "      <td>Clairol</td>\n",
       "      <td>https://i5.walmartimages.com/asr/00a6e54a-e431...</td>\n",
       "      <td>3.7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>33</th>\n",
       "      <td>DenTek Kids Fun Flossers, Removes Food &amp; Plaqu...</td>\n",
       "      <td>3.0</td>\n",
       "      <td>DenTek</td>\n",
       "      <td>https://i5.walmartimages.com/asr/de6e52eb-6e18...</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>61</th>\n",
       "      <td>COVERGIRL Exhibitionist Cream Lipstick, 395 Da...</td>\n",
       "      <td>713.0</td>\n",
       "      <td>COVERGIRL</td>\n",
       "      <td>https://i5.walmartimages.com/asr/95076ec0-ffbd...</td>\n",
       "      <td>4.3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>64</th>\n",
       "      <td>Neutrogena SkinClearing Oil-Free Liquid Founda...</td>\n",
       "      <td>741.0</td>\n",
       "      <td>Neutrogena</td>\n",
       "      <td>https://i5.walmartimages.com/asr/fd4d78d8-310a...</td>\n",
       "      <td>4.2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>69</th>\n",
       "      <td>Design Essentials Natural Coconut &amp; Monoi Curl...</td>\n",
       "      <td>1.0</td>\n",
       "      <td>Design Essentials</td>\n",
       "      <td>https://i5.walmartimages.com/asr/ff2dba1d-0c02...</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>78</th>\n",
       "      <td>Paul Sebastian Fine Cologne Spray, Cologne for...</td>\n",
       "      <td>28.0</td>\n",
       "      <td>Paul Sebastian</td>\n",
       "      <td>https://i5.walmartimages.com/asr/03d08a07-18d7...</td>\n",
       "      <td>4.8</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>85</th>\n",
       "      <td>BioAstin Hawaiian Astaxanthin, Vegan, 12mg, 75 Ct</td>\n",
       "      <td>3.0</td>\n",
       "      <td>Bioastin</td>\n",
       "      <td>https://i5.walmartimages.com/asr/6da9e238-b19e...</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>92</th>\n",
       "      <td>Bytewise Organic Moringa Leaf Powder, 12 Oz</td>\n",
       "      <td>0.0</td>\n",
       "      <td>Bytewise</td>\n",
       "      <td>https://i5.walmartimages.com/asr/076f2b3f-fdc3...</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>94</th>\n",
       "      <td>Ag Hair Cosmetics Ultradynamics Extra-Firm Fin...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>AG Hair</td>\n",
       "      <td>https://i5.walmartimages.com/asr/5d217d98-a385...</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>108</th>\n",
       "      <td>OPI Nail Dipping Powder Perfection Combo - Liq...</td>\n",
       "      <td>1.0</td>\n",
       "      <td>OPI</td>\n",
       "      <td>https://i5.walmartimages.com/asr/ef1607ee-5bdb...</td>\n",
       "      <td>3.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                                  Name  ReviewCount  \\\n",
       "15   Clairol Natural Instincts Demi-Permanent Hair ...       2935.0   \n",
       "33   DenTek Kids Fun Flossers, Removes Food & Plaqu...          3.0   \n",
       "61   COVERGIRL Exhibitionist Cream Lipstick, 395 Da...        713.0   \n",
       "64   Neutrogena SkinClearing Oil-Free Liquid Founda...        741.0   \n",
       "69   Design Essentials Natural Coconut & Monoi Curl...          1.0   \n",
       "78   Paul Sebastian Fine Cologne Spray, Cologne for...         28.0   \n",
       "85   BioAstin Hawaiian Astaxanthin, Vegan, 12mg, 75 Ct          3.0   \n",
       "92         Bytewise Organic Moringa Leaf Powder, 12 Oz          0.0   \n",
       "94   Ag Hair Cosmetics Ultradynamics Extra-Firm Fin...          0.0   \n",
       "108  OPI Nail Dipping Powder Perfection Combo - Liq...          1.0   \n",
       "\n",
       "                 Brand                                           ImageURL  \\\n",
       "15             Clairol  https://i5.walmartimages.com/asr/00a6e54a-e431...   \n",
       "33              DenTek  https://i5.walmartimages.com/asr/de6e52eb-6e18...   \n",
       "61           COVERGIRL  https://i5.walmartimages.com/asr/95076ec0-ffbd...   \n",
       "64          Neutrogena  https://i5.walmartimages.com/asr/fd4d78d8-310a...   \n",
       "69   Design Essentials  https://i5.walmartimages.com/asr/ff2dba1d-0c02...   \n",
       "78      Paul Sebastian  https://i5.walmartimages.com/asr/03d08a07-18d7...   \n",
       "85            Bioastin  https://i5.walmartimages.com/asr/6da9e238-b19e...   \n",
       "92            Bytewise  https://i5.walmartimages.com/asr/076f2b3f-fdc3...   \n",
       "94             AG Hair  https://i5.walmartimages.com/asr/5d217d98-a385...   \n",
       "108                OPI  https://i5.walmartimages.com/asr/ef1607ee-5bdb...   \n",
       "\n",
       "     Rating  \n",
       "15      3.7  \n",
       "33      0.0  \n",
       "61      4.3  \n",
       "64      4.2  \n",
       "69      5.0  \n",
       "78      4.8  \n",
       "85      5.0  \n",
       "92      0.0  \n",
       "94      0.0  \n",
       "108     3.0  "
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "recommended_items_details.head(10)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b315744a",
   "metadata": {},
   "source": [
    "# Function That Recommend Items"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "id": "9867d4e0",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Top 5 recommendations for User 4:\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Name</th>\n",
       "      <th>ReviewCount</th>\n",
       "      <th>Brand</th>\n",
       "      <th>ImageURL</th>\n",
       "      <th>Rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>61</th>\n",
       "      <td>COVERGIRL Exhibitionist Cream Lipstick, 395 Da...</td>\n",
       "      <td>713.0</td>\n",
       "      <td>COVERGIRL</td>\n",
       "      <td>https://i5.walmartimages.com/asr/95076ec0-ffbd...</td>\n",
       "      <td>4.3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>85</th>\n",
       "      <td>BioAstin Hawaiian Astaxanthin, Vegan, 12mg, 75 Ct</td>\n",
       "      <td>3.0</td>\n",
       "      <td>Bioastin</td>\n",
       "      <td>https://i5.walmartimages.com/asr/6da9e238-b19e...</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>86</th>\n",
       "      <td>LOreal Paris Feria Multi-Faceted Shimmering Pe...</td>\n",
       "      <td>2144.0</td>\n",
       "      <td>L'Oreal Paris</td>\n",
       "      <td>https://i5.walmartimages.com/asr/c229026a-2b75...</td>\n",
       "      <td>3.1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>108</th>\n",
       "      <td>OPI Nail Dipping Powder Perfection Combo - Liq...</td>\n",
       "      <td>1.0</td>\n",
       "      <td>OPI</td>\n",
       "      <td>https://i5.walmartimages.com/asr/ef1607ee-5bdb...</td>\n",
       "      <td>3.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>144</th>\n",
       "      <td>Covidien Curity Maternity Pad Heavy 4.33&amp;quot ...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>Covidien</td>\n",
       "      <td>https://i5.walmartimages.com/asr/e4e38217-ed43...</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>155</th>\n",
       "      <td>Crest 3D White Brilliance Mouthwash, Alcohol F...</td>\n",
       "      <td>63.0</td>\n",
       "      <td>Crest</td>\n",
       "      <td>https://i5.walmartimages.com/asr/1fcc5525-9ae3...</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>174</th>\n",
       "      <td>COVERGIRL Outlast All-Day Moisturizing Lip Col...</td>\n",
       "      <td>36.0</td>\n",
       "      <td>COVERGIRL</td>\n",
       "      <td>https://i5.walmartimages.com/asr/4479896f-c6c4...</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>193</th>\n",
       "      <td>Revlon ColorStay Skinny Liquid Liner, 304 Gree...</td>\n",
       "      <td>70.0</td>\n",
       "      <td>Revlon</td>\n",
       "      <td>https://i5.walmartimages.com/asr/aa3b20a6-3d6d...</td>\n",
       "      <td>4.5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>212</th>\n",
       "      <td>Comvita Certified UMF 20+ Manuka Honey, Raw &amp; ...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>Comvita</td>\n",
       "      <td>https://i5.walmartimages.com/asr/3cdc1498-a2ac...</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>241</th>\n",
       "      <td>Ahava Mens Mineral Hand Cream, 3.4 Oz</td>\n",
       "      <td>0.0</td>\n",
       "      <td>Ahava</td>\n",
       "      <td>https://i5.walmartimages.com/asr/f74e4bb7-47d3...</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                                  Name  ReviewCount  \\\n",
       "61   COVERGIRL Exhibitionist Cream Lipstick, 395 Da...        713.0   \n",
       "85   BioAstin Hawaiian Astaxanthin, Vegan, 12mg, 75 Ct          3.0   \n",
       "86   LOreal Paris Feria Multi-Faceted Shimmering Pe...       2144.0   \n",
       "108  OPI Nail Dipping Powder Perfection Combo - Liq...          1.0   \n",
       "144  Covidien Curity Maternity Pad Heavy 4.33&quot ...          0.0   \n",
       "155  Crest 3D White Brilliance Mouthwash, Alcohol F...         63.0   \n",
       "174  COVERGIRL Outlast All-Day Moisturizing Lip Col...         36.0   \n",
       "193  Revlon ColorStay Skinny Liquid Liner, 304 Gree...         70.0   \n",
       "212  Comvita Certified UMF 20+ Manuka Honey, Raw & ...          0.0   \n",
       "241              Ahava Mens Mineral Hand Cream, 3.4 Oz          0.0   \n",
       "\n",
       "             Brand                                           ImageURL  Rating  \n",
       "61       COVERGIRL  https://i5.walmartimages.com/asr/95076ec0-ffbd...     4.3  \n",
       "85        Bioastin  https://i5.walmartimages.com/asr/6da9e238-b19e...     5.0  \n",
       "86   L'Oreal Paris  https://i5.walmartimages.com/asr/c229026a-2b75...     3.1  \n",
       "108            OPI  https://i5.walmartimages.com/asr/ef1607ee-5bdb...     3.0  \n",
       "144       Covidien  https://i5.walmartimages.com/asr/e4e38217-ed43...     0.0  \n",
       "155          Crest  https://i5.walmartimages.com/asr/1fcc5525-9ae3...     0.0  \n",
       "174      COVERGIRL  https://i5.walmartimages.com/asr/4479896f-c6c4...     0.0  \n",
       "193         Revlon  https://i5.walmartimages.com/asr/aa3b20a6-3d6d...     4.5  \n",
       "212        Comvita  https://i5.walmartimages.com/asr/3cdc1498-a2ac...     0.0  \n",
       "241          Ahava  https://i5.walmartimages.com/asr/f74e4bb7-47d3...     0.0  "
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "def collaborative_filtering_recommendations(train_data, target_user_id, top_n=10):\n",
    "    # Create the user-item matrix\n",
    "    user_item_matrix = train_data.pivot_table(index='ID', columns='ProdID', values='Rating', aggfunc='mean').fillna(0)\n",
    "\n",
    "    # Calculate the user similarity matrix using cosine similarity\n",
    "    user_similarity = cosine_similarity(user_item_matrix)\n",
    "\n",
    "    # Find the index of the target user in the matrix\n",
    "    target_user_index = user_item_matrix.index.get_loc(target_user_id)\n",
    "\n",
    "    # Get the similarity scores for the target user\n",
    "    user_similarities = user_similarity[target_user_index]\n",
    "\n",
    "    # Sort the users by similarity in descending order (excluding the target user)\n",
    "    similar_users_indices = user_similarities.argsort()[::-1][1:]\n",
    "\n",
    "    # Generate recommendations based on similar users\n",
    "    recommended_items = []\n",
    "\n",
    "    for user_index in similar_users_indices:\n",
    "        # Get items rated by the similar user but not by the target user\n",
    "        rated_by_similar_user = user_item_matrix.iloc[user_index]\n",
    "        not_rated_by_target_user = (rated_by_similar_user == 0) & (user_item_matrix.iloc[target_user_index] == 0)\n",
    "\n",
    "        # Extract the item IDs of recommended items\n",
    "        recommended_items.extend(user_item_matrix.columns[not_rated_by_target_user][:top_n])\n",
    "\n",
    "    # Get the details of recommended items\n",
    "    recommended_items_details = train_data[train_data['ProdID'].isin(recommended_items)][['Name', 'ReviewCount', 'Brand', 'ImageURL', 'Rating']]\n",
    "\n",
    "    return recommended_items_details.head(10)\n",
    "\n",
    "# Example usage\n",
    "target_user_id = 4\n",
    "top_n = 5\n",
    "collaborative_filtering_rec = collaborative_filtering_recommendations(train_data, target_user_id)\n",
    "print(f\"Top {top_n} recommendations for User {target_user_id}:\")\n",
    "collaborative_filtering_rec"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2839d618",
   "metadata": {},
   "source": [
    "# Hybrid Recommendations"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "id": "77dadbb3",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Hybrid Recommendations (Combine Content-Based and Collaborative Filtering)\n",
    "def hybrid_recommendations(train_data,target_user_id, item_name, top_n=10):\n",
    "    # Get content-based recommendations\n",
    "    content_based_rec = content_based_recommendations(train_data,item_name, top_n)\n",
    "\n",
    "    # Get collaborative filtering recommendations\n",
    "    collaborative_filtering_rec = collaborative_filtering_recommendations(train_data,target_user_id, top_n)\n",
    "    \n",
    "    # Merge and deduplicate the recommendations\n",
    "    hybrid_rec = pd.concat([content_based_rec, collaborative_filtering_rec]).drop_duplicates()\n",
    "    \n",
    "    return hybrid_rec.head(10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "id": "5320ae95",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Top 10 Hybrid Recommendations for User 4 and Item 'OPI Nail Lacquer Polish .5oz/15mL - This Gown Needs A Crown NL U11':\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Name</th>\n",
       "      <th>ReviewCount</th>\n",
       "      <th>Brand</th>\n",
       "      <th>ImageURL</th>\n",
       "      <th>Rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1215</th>\n",
       "      <td>OPI Nail Lacquer Polish .5oz/15mL - Put A Coat...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>OPI</td>\n",
       "      <td>https://i5.walmartimages.com/asr/b51a716d-565c...</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>545</th>\n",
       "      <td>OPI Nail Lacquer Polish .5oz/15mL - Sweet Hear...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>OPI</td>\n",
       "      <td>https://i5.walmartimages.com/asr/136eb3a3-1668...</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3852</th>\n",
       "      <td>OPI Nail Lacquer Polish .5oz/15mL - A-taupe th...</td>\n",
       "      <td>1.0</td>\n",
       "      <td>OPI</td>\n",
       "      <td>https://i5.walmartimages.com/asr/4b895a60-06c2...</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1594</th>\n",
       "      <td>Nail Lacquer - # NL E74 Youre Such a BudaPest ...</td>\n",
       "      <td>5.0</td>\n",
       "      <td>OPI</td>\n",
       "      <td>https://i5.walmartimages.com/asr/bb6e42b8-35ee...</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4645</th>\n",
       "      <td>OPI Nail Lacquer Polish .5oz/15mL - Champagne ...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>OPI</td>\n",
       "      <td>https://i5.walmartimages.com/asr/5f4ec827-6edc...</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4109</th>\n",
       "      <td>OPI Nail Lacquer Polish .5oz/15mL - Girls Love...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>OPI</td>\n",
       "      <td>https://i5.walmartimages.com/asr/6d70f6db-0442...</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4310</th>\n",
       "      <td>OPI Nail Lacquer Polish .5oz/15mL - So Many Cl...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>OPI</td>\n",
       "      <td>https://i5.walmartimages.com/asr/b24090e9-9cf9...</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3719</th>\n",
       "      <td>OPI Nail Lacquer Polish .5oz/15mL - Ski Slope ...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>OPI</td>\n",
       "      <td>https://i5.walmartimages.com/asr/8466cc9b-40da...</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4010</th>\n",
       "      <td>OPI Nail Polish, Are We There Yet?, 0.5 Fl Oz</td>\n",
       "      <td>2.0</td>\n",
       "      <td>OPI</td>\n",
       "      <td>https://i5.walmartimages.com/asr/bb0c5e20-0ead...</td>\n",
       "      <td>3.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3052</th>\n",
       "      <td>OPI Nail Lacquer Nail Polish, Hawaiian Orchid</td>\n",
       "      <td>1.0</td>\n",
       "      <td>OPI</td>\n",
       "      <td>https://i5.walmartimages.com/asr/cef5a3ca-dfed...</td>\n",
       "      <td>4.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                                   Name  ReviewCount Brand  \\\n",
       "1215  OPI Nail Lacquer Polish .5oz/15mL - Put A Coat...          0.0   OPI   \n",
       "545   OPI Nail Lacquer Polish .5oz/15mL - Sweet Hear...          0.0   OPI   \n",
       "3852  OPI Nail Lacquer Polish .5oz/15mL - A-taupe th...          1.0   OPI   \n",
       "1594  Nail Lacquer - # NL E74 Youre Such a BudaPest ...          5.0   OPI   \n",
       "4645  OPI Nail Lacquer Polish .5oz/15mL - Champagne ...          0.0   OPI   \n",
       "4109  OPI Nail Lacquer Polish .5oz/15mL - Girls Love...          0.0   OPI   \n",
       "4310  OPI Nail Lacquer Polish .5oz/15mL - So Many Cl...          0.0   OPI   \n",
       "3719  OPI Nail Lacquer Polish .5oz/15mL - Ski Slope ...          0.0   OPI   \n",
       "4010      OPI Nail Polish, Are We There Yet?, 0.5 Fl Oz          2.0   OPI   \n",
       "3052      OPI Nail Lacquer Nail Polish, Hawaiian Orchid          1.0   OPI   \n",
       "\n",
       "                                               ImageURL  Rating  \n",
       "1215  https://i5.walmartimages.com/asr/b51a716d-565c...     0.0  \n",
       "545   https://i5.walmartimages.com/asr/136eb3a3-1668...     0.0  \n",
       "3852  https://i5.walmartimages.com/asr/4b895a60-06c2...     0.0  \n",
       "1594  https://i5.walmartimages.com/asr/bb6e42b8-35ee...     5.0  \n",
       "4645  https://i5.walmartimages.com/asr/5f4ec827-6edc...     0.0  \n",
       "4109  https://i5.walmartimages.com/asr/6d70f6db-0442...     0.0  \n",
       "4310  https://i5.walmartimages.com/asr/b24090e9-9cf9...     0.0  \n",
       "3719  https://i5.walmartimages.com/asr/8466cc9b-40da...     0.0  \n",
       "4010  https://i5.walmartimages.com/asr/bb0c5e20-0ead...     3.0  \n",
       "3052  https://i5.walmartimages.com/asr/cef5a3ca-dfed...     4.0  "
      ]
     },
     "execution_count": 40,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Example usage: Get hybrid recommendations for a specific user and item\n",
    "target_user_id = 4 # Change this to the user_id you want recommendations for\n",
    "item_name = \"OPI Nail Lacquer Polish .5oz/15mL - This Gown Needs A Crown NL U11\"  # Change this to the item name\n",
    "hybrid_rec = hybrid_recommendations(train_data,target_user_id, item_name, top_n=10)\n",
    "\n",
    "print(f\"Top 10 Hybrid Recommendations for User {target_user_id} and Item '{item_name}':\")\n",
    "hybrid_rec"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "id": "c56891bd",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Top 10 Hybrid Recommendations for User 10 and Item 'Black Radiance Perfect Tone Matte Lip Crème, Succulent Plum':\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Name</th>\n",
       "      <th>ReviewCount</th>\n",
       "      <th>Brand</th>\n",
       "      <th>ImageURL</th>\n",
       "      <th>Rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>896</th>\n",
       "      <td>Black Radiance Perfect Tone Lip Color, Vintage...</td>\n",
       "      <td>78.0</td>\n",
       "      <td>Black Radiance</td>\n",
       "      <td>https://i5.walmartimages.com/asr/485f26b4-a19a...</td>\n",
       "      <td>4.7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2496</th>\n",
       "      <td>Black Radiance Perfect Tone Lip Color, Hollywo...</td>\n",
       "      <td>18.0</td>\n",
       "      <td>Black Radiance</td>\n",
       "      <td>https://i5.walmartimages.com/asr/fe3da48f-5142...</td>\n",
       "      <td>4.3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2136</th>\n",
       "      <td>Black Radiance Brilliant Effects Lip Gloss, Bl...</td>\n",
       "      <td>95.0</td>\n",
       "      <td>Black Radiance</td>\n",
       "      <td>https://i5.walmartimages.com/asr/f6784519-2c86...</td>\n",
       "      <td>4.4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3140</th>\n",
       "      <td>Laura Mercier Tone Perfecting Eye Gel Crème 0....</td>\n",
       "      <td>11.0</td>\n",
       "      <td>Laura Mercier</td>\n",
       "      <td>https://i5.walmartimages.com/asr/9cd9aea3-5ac3...</td>\n",
       "      <td>3.7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>398</th>\n",
       "      <td>IMAN Skin Tone Evener BB Crème, Light Sand</td>\n",
       "      <td>19.0</td>\n",
       "      <td>IMAN Cosmetics</td>\n",
       "      <td>https://i5.walmartimages.com/asr/b387123b-700d...</td>\n",
       "      <td>3.9</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3885</th>\n",
       "      <td>Two-Tone Comfort Yoga Mat</td>\n",
       "      <td>0.0</td>\n",
       "      <td>EDX</td>\n",
       "      <td>https://i5.walmartimages.com/asr/75ebb9e7-07eb...</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4589</th>\n",
       "      <td>Revlon ColorStay Longwear Lip Liner, 665 Plum,...</td>\n",
       "      <td>1678.0</td>\n",
       "      <td>Revlon</td>\n",
       "      <td>https://i5.walmartimages.com/asr/075c59a0-3a35...</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>725</th>\n",
       "      <td>LOreal Paris Colour Riche Lip Liner, Lasting P...</td>\n",
       "      <td>85.0</td>\n",
       "      <td>L'Oreal Paris</td>\n",
       "      <td>https://i5.walmartimages.com/asr/194b6bcc-6cd6...</td>\n",
       "      <td>4.4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>680</th>\n",
       "      <td>Revlon Revlon Super Lustrous Lipstick with Vit...</td>\n",
       "      <td>2031.0</td>\n",
       "      <td>Revlon</td>\n",
       "      <td>https://i5.walmartimages.com/asr/f21188e6-b3ef...</td>\n",
       "      <td>4.4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1559</th>\n",
       "      <td>LOreal Paris Colour Riche Matte Lip Liner, Mat...</td>\n",
       "      <td>495.0</td>\n",
       "      <td>L'Oreal Paris</td>\n",
       "      <td>https://i5.walmartimages.com/asr/baf97085-7231...</td>\n",
       "      <td>4.4</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                                   Name  ReviewCount  \\\n",
       "896   Black Radiance Perfect Tone Lip Color, Vintage...         78.0   \n",
       "2496  Black Radiance Perfect Tone Lip Color, Hollywo...         18.0   \n",
       "2136  Black Radiance Brilliant Effects Lip Gloss, Bl...         95.0   \n",
       "3140  Laura Mercier Tone Perfecting Eye Gel Crème 0....         11.0   \n",
       "398          IMAN Skin Tone Evener BB Crème, Light Sand         19.0   \n",
       "3885                          Two-Tone Comfort Yoga Mat          0.0   \n",
       "4589  Revlon ColorStay Longwear Lip Liner, 665 Plum,...       1678.0   \n",
       "725   LOreal Paris Colour Riche Lip Liner, Lasting P...         85.0   \n",
       "680   Revlon Revlon Super Lustrous Lipstick with Vit...       2031.0   \n",
       "1559  LOreal Paris Colour Riche Matte Lip Liner, Mat...        495.0   \n",
       "\n",
       "               Brand                                           ImageURL  \\\n",
       "896   Black Radiance  https://i5.walmartimages.com/asr/485f26b4-a19a...   \n",
       "2496  Black Radiance  https://i5.walmartimages.com/asr/fe3da48f-5142...   \n",
       "2136  Black Radiance  https://i5.walmartimages.com/asr/f6784519-2c86...   \n",
       "3140   Laura Mercier  https://i5.walmartimages.com/asr/9cd9aea3-5ac3...   \n",
       "398   IMAN Cosmetics  https://i5.walmartimages.com/asr/b387123b-700d...   \n",
       "3885             EDX  https://i5.walmartimages.com/asr/75ebb9e7-07eb...   \n",
       "4589          Revlon  https://i5.walmartimages.com/asr/075c59a0-3a35...   \n",
       "725    L'Oreal Paris  https://i5.walmartimages.com/asr/194b6bcc-6cd6...   \n",
       "680           Revlon  https://i5.walmartimages.com/asr/f21188e6-b3ef...   \n",
       "1559   L'Oreal Paris  https://i5.walmartimages.com/asr/baf97085-7231...   \n",
       "\n",
       "      Rating  \n",
       "896      4.7  \n",
       "2496     4.3  \n",
       "2136     4.4  \n",
       "3140     3.7  \n",
       "398      3.9  \n",
       "3885     0.0  \n",
       "4589     0.0  \n",
       "725      4.4  \n",
       "680      4.4  \n",
       "1559     4.4  "
      ]
     },
     "execution_count": 43,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Example usage: Get hybrid recommendations for a specific user and item\n",
    "target_user_id = 10 # Change this to the user_id you want recommendations for\n",
    "item_name = 'Black Radiance Perfect Tone Matte Lip Crème, Succulent Plum'\n",
    "\n",
    "hybrid_rec = hybrid_recommendations(train_data,target_user_id, item_name, top_n=10)\n",
    "\n",
    "print(f\"Top 10 Hybrid Recommendations for User {target_user_id} and Item '{item_name}':\")\n",
    "hybrid_rec"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "0f9cc1b6",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "118063f0",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "base",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
